package org.crawler;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.util.Ajax;
import org.util.StringProcess;

/**
 * 获取url。一直往下
 * 
 * @author flysLi
 *
 */
public class AlwaysGetUri {
	
	private static String baseUri = null;

	private int imgIndex = 1;// 下标

	// 用于存储未访问的链接
	private static List<String> no_access_uri = new ArrayList<String>();

	// 已访问的uri
	private static List<String> visited_uri = new ArrayList<String>();

	public AlwaysGetUri() {

	}

	/**
	 * 通过uri去寻找其页面内的uri 平面优先，地毯式查找
	 * 
	 * @param uri
	 */
	public void crawler(String uri) {
		System.out.println("当前访问的链接:" + uri);
		/**
		 * 1.判断已访问链接中是否有此链接，如果有，则不将其存入未访问。没有，则将其存入未访问
		 * 
		 */

		//将当前连接存入已访问集合
		visited_uri.add(uri);
		
		//将当前uri赋值给成员变量baseUri
		baseUri = uri + "/";

		//删除未访问集合中的当前链接
		no_access_uri.remove(uri);

		String sourceHtml = null;
		
		try {
			sourceHtml = Ajax.post(uri);
		} catch (IOException e) {
			
			crawler(baseUri + "/" + uri);
		}

		// 开始平面查找其Img和a标签中的Src、href等属性值的绝对地址
		Document doc = Jsoup.parse(sourceHtml);
		
		Elements as = doc.getElementsByTag("a");
		
		// 收集url
		collectUrl(as);
		
		// 收集图片
		Elements imgs = doc.getElementsByTag("img");

		// 下载图片
		downloadImages(imgs);

		// Url收集完成之后,继续取未访问集合中的链接[递归]
		crawler(no_access_uri.get(0));
	}

	/**
	 * 收集所有的url
	 * @param as
	 */
	public void collectUrl(Elements as) {
		for (Element a : as) {

			String url = a.attr("href");

			System.out.println("收集了一个url -> " + url);

			// 判断是否是绝对地址，如果不是，则帮助拼接
			if (url.indexOf("http") == -1) {
				continue;
			}

			boolean isV = isVisited(url);

			if (!isV) { // isV == true | 已访问中存在此链接。则不需要存入未访问集合中

				no_access_uri.add(url);
				System.out.println("收集了一个url");
			}
		}
	}

	/**
	 * 下载图片
	 */
	public void downloadImages(Elements images) {

		for (Element img : images) {

			imgIndex++;

			String src = img.attr("src");
			
			String imgName = null;

			try {

				imgName = src.substring(src.lastIndexOf("/")+1);
				System.out.println(imgName);
				if(src.indexOf("grey.gif")>-1){
					continue;
				}
				
				Ajax.download(src, imgName, "D:\\学习\\APP\\素材\\设计稿\\");
				
				System.out.println("下载成功--> " + imgName);

			} catch (Exception e) {

				System.out.println("图片地址不对-> " + src);
				src = baseUri + src;
				try {
					
					Ajax.download(src, imgName, "D:\\学习\\APP\\素材\\设计稿\\");
				
				} catch (Exception e1) {
					System.out.println("图片实在下载不下来啊");
				}
			}
		}

	}

	/**
	 * 判断uri是否在已访问队列中存在 如果存在则返回true。 不存在返回false
	 * 
	 * @param uri
	 * @return
	 */
	public boolean isVisited(String uri) {

		boolean falg = visited_uri.contains(uri);

		return falg;
	}

	/**
	 * 删除指定的uri
	 * 
	 * @param uri
	 */
	public void removeUri(String uri) {

		no_access_uri.remove(uri);
	}
}
